
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包</title>
</head>
<body>
    

    <script>


        // 外部无法访问函数内部的局部变量

        // 闭包： 一个函数的返回值是另外一个函数，而返回的那个函数要访问其父函数的局部变量，且返回的那个函数要在外部被执行；就产生闭包。
        // 闭包其实就是那个外部函数-高阶函数  闭包也是一种环境。

        // 闭包  closure
        // function fn() {
        //     var num = 100;
        //     return  function () {
        //         console.log(++num);
                
        //     }
        // }

        // fn()()  //链式调用



        function fn() {
            var num = 100;
            function inner() {
                console.log(++num);
                
            }
            return  inner;
        }

        // 分开调用
        let f = fn()

        f()


        //    闭包的三个特性
	// 	1:函数套函数
	// 	2:内部函数可以直接访问外部函数的内部变量或参数
	// 	3:变量或参数不会被垃圾回收机制回收  GC
		
		// 闭包的优点:
		// 1:实现了数据的私有化，避免了全局变量的污染
		// 2:外层也能访问里层函数的变量
		// 3:私有成员的存在

        // 闭包的缺点
		// 常驻内存  增大内存的使用量  使用不当会造成内存的泄露.--一直常驻（始终在）内存中  

		// 由于闭包会使得函数中的变量都被保存在内存中，内存消耗很大，所以不能滥用闭包，否则会造成网页的性能问题，在IE中可能导致内存泄露。
        // 解决方法是，在退出函数之前，将不使用的局部变量全部删除。  设置为null也可以
     
        
        var  count = 1;

        function add() {
            var count = 10;
            return function () {
                count+=1;
                alert(count)
            }
        }

        var s = add()
        s()//11
        s()//12
        s()//13


    </script>
</body>
</html>